package tools

import (
	"github.com/rs/cors"
	"net/http"
)

// CorsMiddleware 跨域请求处理中间件
type CorsMiddleware struct {
}

// NewCorsMiddleware 新建跨域请求处理中间件
func NewCorsMiddleware() *CorsMiddleware {
	return &CorsMiddleware{}
}

// Handle 跨域请求处理
func (m *CorsMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
	//return func(w http.ResponseWriter, r *http.Request) {
	//	setHeader(w)
	//
	//	// 放行所有 OPTIONS 方法
	//	if r.Method == "OPTIONS" {
	//		w.WriteHeader(http.StatusNoContent)
	//		return
	//	}
	//
	//	// 处理请求
	//	next(w, r)
	//}
	// 定义一个 CORS 配置。这里使用了默认配置，但你可以根据需要进行调整。
	corsConfig := cors.Default()

	// 创建一个 CORS 处理器，它将基于上面的配置来处理请求
	corsHandler := corsConfig.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 这里的处理逻辑是可选的。如果你只想应用 CORS 配置而不做其他处理，可以省略这个处理器。
		// 但在这个示例中，我们保留了一个空的处理器来演示如何将其与 cors.Handler 结合使用。
	}))

	// 由于 cors.Handler 返回的是一个 http.Handler，我们需要将其转换为一个 http.HandlerFunc
	// 以便与 gozero 的中间件机制兼容。这里我们使用了一个简单的封装来实现转换。
	return func(w http.ResponseWriter, r *http.Request) {
		corsHandler.ServeHTTP(w, r)
		// 处理请求
		next(w, r)
	}
}

// NewCorsMiddleware1 创建一个新的 CORS 中间件
func NewCorsMiddleware1() http.HandlerFunc {
	// 定义一个 CORS 配置。这里使用了默认配置，但你可以根据需要进行调整。
	corsConfig := cors.Default()

	// 创建一个 CORS 处理器，它将基于上面的配置来处理请求
	corsHandler := corsConfig.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 这里的处理逻辑是可选的。如果你只想应用 CORS 配置而不做其他处理，可以省略这个处理器。
		// 但在这个示例中，我们保留了一个空的处理器来演示如何将其与 cors.Handler 结合使用。
	}))

	// 由于 cors.Handler 返回的是一个 http.Handler，我们需要将其转换为一个 http.HandlerFunc
	// 以便与 gozero 的中间件机制兼容。这里我们使用了一个简单的封装来实现转换。
	return func(w http.ResponseWriter, r *http.Request) {
		corsHandler.ServeHTTP(w, r)
	}
}

// Handler 跨域请求处理器
func (m *CorsMiddleware) Handler() http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		setHeader(w)

		if r.Method == "OPTIONS" {
			w.WriteHeader(http.StatusNoContent)
		} else {
			w.WriteHeader(http.StatusNotFound)
		}
	})
}

// setHeader 设置响应头
func setHeader(w http.ResponseWriter) {
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.Header().Set("Access-Control-Allow-Headers", "*")
	w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH")
	w.Header().Set("Access-Control-Expose-Headers", "Content-Length, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
	w.Header().Set("Access-Control-Allow-Credentials", "true")
}
